package generic06;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 泛型优点
 *   1.使用泛型可以将运行时期可能出现的问题(强制转换异常)提升到编译时期
 *   2.省去强转,可以直接调用集合中元素类型的方法
 */
public class Demo01 {
    public static void main(String[] args) {
        //method01();
        //method02();
        Collection<String> c = new ArrayList<String>();
        c.add("abc");
        c.add("def");
        for (String s : c) {
            System.out.println(s.length());
        }
    }

    private static void method02() {
        Collection<String> c = new ArrayList<String>();
        c.add("abc"); //add方法的形参被确定为String类型
        //c.add(123); //无法添加Integer类型
        for (Object o : c) {


            String str = (String)o;

            System.out.println(str.length());
        }
    }

    private static void method01() {
        Collection c = new ArrayList();//由于接口上的泛型没有指定类型,所有Collection<E> 中的 E泛型变量被替换成Object类型
        //而我们的add(E e)方法用到接口上的E 所以add(E e)方法上E也被替换成Object类型
        c.add("abc");
        c.add(123);

        for (Object o : c) { //第一循环遍历到"abc" Object o ="abc"
                            //第二次循环遍历到123  Object o =new Integer(123)

            String str = (String)o;//第一循环遍历到"abc" String str="abc"
                                   //第二次循环遍历到123 String str= (String)new Integer(123) 此时由于String和Integer没有父子关系
                                   //所以java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
            System.out.println(str.length());
        }
    }
}
